package com.luo.backend.service;

import com.luo.backend.config.BaiduAIConfig;
import com.luo.backend.entity.Food;
import com.luo.backend.entity.GroupBuyingActivity;
import com.luo.backend.entity.Order;
import com.luo.backend.entity.User;
import com.luo.backend.repository.FoodRepository;
import com.luo.backend.repository.GroupBuyingActivityRepository;
import com.luo.backend.repository.OrderRepository;
import com.luo.backend.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.data.domain.PageRequest;

import java.math.BigDecimal;
import java.util.*;

/**
 * AI服务类 - 百度文心一言集成
 */
@Service
public class AIService {
    
    private static final Logger logger = LoggerFactory.getLogger(AIService.class);
    
    @Autowired
    private BaiduAIConfig aiConfig;
    
    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private FoodRepository foodRepository;
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private GroupBuyingActivityRepository groupBuyingActivityRepository;
    
    /**
     * AI聊天接口（核心方法）- 使用新版API Key认证
     */
    public String chat(String userMessage, Long userId) {
        logger.info("用户 {} 发送消息：{}", userId, userMessage);
        
        try {
            // 检查配置
            if (aiConfig.getApiKey() == null || aiConfig.getApiKey().isEmpty()) {
                throw new RuntimeException("未配置百度AI API Key，请检查环境变量BAIDU_AI_API_KEY");
            }
            
            logger.debug("使用API Key: {}...", aiConfig.getApiKey().substring(0, Math.min(15, aiConfig.getApiKey().length())));
            
            // 1. 构建请求体
            Map<String, Object> requestBody = buildRequestBody(userMessage, userId);
            
            // 2. 设置请求头（新版API Key认证）
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.set("Authorization", "Bearer " + aiConfig.getApiKey());
            
            HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
            
            // 3. 发送请求
            logger.info("==================== 发送请求到百度API ====================");
            logger.info("URL: {}", aiConfig.getChatUrl());
            logger.info("API Key前缀: {}...", aiConfig.getApiKey().substring(0, Math.min(20, aiConfig.getApiKey().length())));
            logger.info("请求体: {}", requestBody);
            logger.info("========================================================");
            
            @SuppressWarnings("unchecked")
            ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
                aiConfig.getChatUrl(), 
                HttpMethod.POST, 
                entity, 
                (Class<Map<String, Object>>)(Class<?>)Map.class);
            
            // 4. 提取AI回复
            if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
                Map<String, Object> body = response.getBody();
                
                // 🔍 详细记录百度API的完整响应
                logger.info("==================== 百度API完整响应 ====================");
                logger.info("HTTP状态码: {}", response.getStatusCode());
                logger.info("响应体键集合: {}", body.keySet());
                logger.info("完整响应内容: {}", body);
                logger.info("=====================================================");
                
                String reply = (String) body.get("result");
                
                // 如果result为空，尝试其他可能的字段
                if (reply == null) {
                    logger.warn("⚠️ 'result'字段为空，尝试其他字段...");
                    
                    // 检查是否有错误信息
                    if (body.containsKey("error_code")) {
                        logger.error("❌ 百度API返回错误: error_code={}, error_msg={}", 
                            body.get("error_code"), body.get("error_msg"));
                        throw new RuntimeException("百度API错误: " + body.get("error_msg"));
                    }
                    
                    // 尝试其他可能的字段名
                    reply = (String) body.get("reply");
                    if (reply == null) {
                        reply = (String) body.get("response");
                    }
                    if (reply == null) {
                        reply = (String) body.get("content");
                    }
                    
                    logger.info("尝试其他字段后，reply = {}", reply);
                }
                
                logger.info("AI回复成功，长度：{}", reply != null ? reply.length() : 0);
                return reply;
            } else {
                throw new RuntimeException("AI响应异常：" + response.getStatusCode());
            }
            
        } catch (Exception e) {
            logger.error("AI聊天失败", e);
            // 返回降级回复
            return getFallbackReply();
        }
    }
    
    /**
     * 构建百度AI请求体（新版API不支持system角色）
     */
    private Map<String, Object> buildRequestBody(String userMessage, Long userId) {
        Map<String, Object> requestBody = new HashMap<>();
        List<Map<String, String>> messages = new ArrayList<>();
        
        // 新版API不支持system角色，将系统提示词融入用户消息
        String systemPrompt = buildSystemPrompt(userMessage, userId);
        String combinedMessage = systemPrompt + "\n\n用户问题：" + userMessage;
        
        // 用户消息（包含系统提示词）
        Map<String, String> userMsg = new HashMap<>();
        userMsg.put("role", "user");
        userMsg.put("content", combinedMessage);
        messages.add(userMsg);
        
        requestBody.put("messages", messages);
        requestBody.put("temperature", 0.7);  // 控制随机性
        requestBody.put("top_p", 0.8);        // 控制多样性
        // 允许联网搜索（用于回答通用问题），但通过提示词严格约束推荐行为
        requestBody.put("disable_search", false);
        requestBody.put("enable_citation", false); // 禁用引用
        
        return requestBody;
    }
    
    /**
     * 构建系统提示词（带动态上下文增强）
     */
    private String buildSystemPrompt(String userMessage, Long userId) {
        StringBuilder prompt = new StringBuilder();
        
        // 基础系统提示词
        prompt.append("你是涛的饭店的AI助手，名字叫小涛🤖。\n\n");
        prompt.append("【你的职责】\n");
        prompt.append("1. 帮助用户推荐美食和商家\n");
        prompt.append("2. 解答订单、配送相关问题\n");
        prompt.append("3. 介绍平台功能和优惠活动\n");
        prompt.append("4. 提供友好、专业的服务\n\n");
        
        prompt.append("【回答原则】\n");
        prompt.append("✅ 简洁明了，控制在200字以内\n");
        prompt.append("✅ 使用emoji让回复更生动（🌶️🍜📦🎁等）\n");
        prompt.append("✅ 推荐时提供3-5个选项，包含价格和评分\n");
        prompt.append("✅ 遇到不确定的问题，引导用户联系人工客服\n");
        prompt.append("✅ 语气友好亲切，使用您称呼用户\n\n");
        
        prompt.append("【重要约束 - 必须严格遵守】\n");
        prompt.append("1️⃣ 关于通用问题：可以使用您的知识回答外卖常识、使用帮助等问题\n");
        prompt.append("2️⃣ 关于商品推荐：只能推荐下方【当前热门商品】中列出的商品，禁止推荐其他任何商品\n");
        prompt.append("3️⃣ 关于活动推荐：只能介绍下方【当前拼单活动】中列出的活动，禁止推荐其他平台活动\n");
        prompt.append("4️⃣ 关于订单查询：只能使用下方【用户最近订单】中的真实订单信息\n");
        prompt.append("5️⃣ 关于其他平台：\n");
        prompt.append("   ❌ 禁止推荐美团、饿了么、京东等竞品平台的任何优惠或商品\n");
        prompt.append("   ❌ 禁止提及其他平台的口令、活动、价格\n");
        prompt.append("   ❌ 禁止引导用户去其他平台\n");
        prompt.append("6️⃣ 数据真实性：\n");
        prompt.append("   ✅ 推荐的商品价格、评分必须与下方数据一致\n");
        prompt.append("   ✅ 如果下方没有相关数据，诚实告知\"暂无相关信息\"\n");
        prompt.append("   ❌ 禁止编造不存在的商品、价格或活动\n\n");
        
        // 动态上下文增强
        try {
            // 获取用户信息
            User user = userRepository.findById(userId).orElse(null);
            if (user != null) {
                prompt.append("【当前用户信息】\n");
                prompt.append("- 用户名：").append(user.getUsername()).append("\n");
                if (user.getRealName() != null) {
                    prompt.append("- 真实姓名：").append(user.getRealName()).append("\n");
                }
            }
            
            // 1. 如果提到"推荐"、"好吃"等关键词，附加热门商品信息
            if (containsKeywords(userMessage, "推荐", "好吃", "美食", "菜", "吃什么")) {
                List<Food> hotFoods = foodRepository.findTop5ByStatusOrderBySoldCountDesc(1, 
                    PageRequest.of(0, 5));
                if (!hotFoods.isEmpty()) {
                    prompt.append("\n【当前热门商品】\n");
                    for (int i = 0; i < Math.min(5, hotFoods.size()); i++) {
                        Food food = hotFoods.get(i);
                        prompt.append(String.format("%d. %s - ¥%.2f（已售%d份，评分%.1f）\n", 
                            i + 1, 
                            food.getName(), 
                            food.getPrice(), 
                            food.getSoldCount(),
                            food.getRating() != null ? food.getRating() : BigDecimal.valueOf(5.0)));
                    }
                }
            }
            
            // 2. 如果提到"订单"，附加用户最近订单信息
            if (containsKeywords(userMessage, "订单", "配送", "送到哪", "在哪里")) {
                List<Order> recentOrders = orderRepository.findTop5ByUserIdOrderByCreatedAtDesc(userId, 
                    PageRequest.of(0, 3));
                if (!recentOrders.isEmpty()) {
                    prompt.append("\n【用户最近订单】\n");
                    for (int i = 0; i < Math.min(3, recentOrders.size()); i++) {
                        Order order = recentOrders.get(i);
                        prompt.append(String.format("- 订单号：%s，状态：%s，金额：¥%.2f\n", 
                            order.getOrderNo(), 
                            getOrderStatusText(order.getStatus()),
                            order.getTotalAmount()));
                    }
                }
            }
            
            // 3. 如果提到"优惠"、"活动"、"拼单"，附加拼单活动信息
            if (containsKeywords(userMessage, "优惠", "活动", "拼单", "便宜", "折扣")) {
                List<GroupBuyingActivity> activities = groupBuyingActivityRepository
                    .findTop5ByStatusOrderByCreatedAtDesc("active", 
                        PageRequest.of(0, 3));
                if (!activities.isEmpty()) {
                    prompt.append("\n【当前拼单活动】\n");
                    for (int i = 0; i < Math.min(3, activities.size()); i++) {
                        GroupBuyingActivity activity = activities.get(i);
                        prompt.append(String.format("- %s：原价¥%.2f，拼单价¥%.2f（已有%d人参与）\n", 
                            activity.getTitle(),
                            activity.getOriginalPrice(),
                            activity.getGroupPrice(),
                            activity.getCurrentParticipants()));
                    }
                }
            }
            
        } catch (Exception e) {
            logger.warn("构建上下文信息失败", e);
        }
        
        prompt.append("\n【最后提醒】\n");
        prompt.append("✅ 通用问题（如使用帮助、常识解答）：可以使用您的知识自由回答\n");
        prompt.append("❗ 推荐类问题（商品、活动、订单）：必须严格使用上方提供的数据\n");
        prompt.append("❗ 推荐时：只推荐【外卖星球平台】的内容，禁止推荐竞品平台\n");
        prompt.append("✅ 数据不足时：诚实告知，不要编造或联网搜索其他平台信息\n\n");
        prompt.append("记住：您是【外卖星球平台】的专属AI助手，您的职责是帮助用户使用本平台，而不是为其他平台引流。\n");
        
        return prompt.toString();
    }
    
    /**
     * 检查消息是否包含关键词
     */
    private boolean containsKeywords(String message, String... keywords) {
        if (message == null) return false;
        for (String keyword : keywords) {
            if (message.contains(keyword)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 获取订单状态文本
     */
    private String getOrderStatusText(String status) {
        switch (status) {
            case "pending": return "待支付";
            case "paid": return "已支付";
            case "preparing": return "准备中";
            case "shipping": return "配送中";
            case "delivered": return "已送达";
            case "cancelled": return "已取消";
            case "refunded": return "已退款";
            default: return status;
        }
    }
    
    /**
     * 降级回复（当AI服务不可用时）
     */
    private String getFallbackReply() {
        return "抱歉，小星暂时有点忙，请稍后再试😊\n\n" +
               "您也可以：\n" +
               "- 浏览首页查看热门商品\n" +
               "- 查看我的订单\n" +
               "- 联系人工客服：400-123-4567";
    }
}

